{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import random\n",
    "import multiprocessing\n",
    "import numpy as np\n",
    "from deap import creator, base, tools, algorithms\n",
    "from vnpy.app.cta_strategy.backtesting import BacktestingEngine\n",
    "from boll_channel_strategy import BollChannelStrategy\n",
    "from datetime import datetime\n",
    "import multiprocessing           #多进程\n",
    "from scoop import futures        #多进程"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def parameter_generate():\n",
    "    '''\n",
    "    根据设置的起始值，终止值和步进，随机生成待优化的策略参数\n",
    "    '''\n",
    "    parameter_list = []\n",
    "    p1 = random.randrange(4,50,2)      #布林带窗口\n",
    "    p2 = random.randrange(4,50,2)      #布林带通道阈值\n",
    "    p3 = random.randrange(4,50,2)      #CCI窗口\n",
    "    p4 = random.randrange(18,40,2)     #ATR窗口 \n",
    "\n",
    "    parameter_list.append(p1)\n",
    "    parameter_list.append(p2)\n",
    "    parameter_list.append(p3)\n",
    "    parameter_list.append(p4)\n",
    "\n",
    "    return parameter_list"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def object_func(strategy_avg):\n",
    "    \"\"\"\n",
    "    本函数为优化目标函数，根据随机生成的策略参数，运行回测后自动返回2个结果指标：收益回撤比和夏普比率\n",
    "    \"\"\"\n",
    "    # 创建回测引擎对象\n",
    "    engine = BacktestingEngine()\n",
    "    engine.set_parameters(\n",
    "        vt_symbol=\"IF88.CFFEX\",\n",
    "        interval=\"1m\",\n",
    "        start=datetime(2018, 9, 1),\n",
    "        end=datetime(2019, 1,1),\n",
    "        rate=0,\n",
    "        slippage=0,\n",
    "        size=300,\n",
    "        pricetick=0.2,\n",
    "        capital=1_000_000,\n",
    "    )\n",
    "\n",
    "    setting = {'boll_window': strategy_avg[0],       #布林带窗口\n",
    "               'boll_dev': strategy_avg[1],        #布林带通道阈值\n",
    "               'cci_window': strategy_avg[2],         #CCI窗口\n",
    "               'atr_window': strategy_avg[3],}    #ATR窗口               \n",
    "\n",
    "    #加载策略          \n",
    "    #engine.initStrategy(TurtleTradingStrategy, setting)\n",
    "    engine.add_strategy(BollChannelStrategy, setting)\n",
    "    engine.load_data()\n",
    "    engine.run_backtesting()\n",
    "    engine.calculate_result()\n",
    "    result = engine.calculate_statistics(Output=False)\n",
    "\n",
    "    return_drawdown_ratio = round(result['return_drawdown_ratio'],2)  #收益回撤比\n",
    "    sharpe_ratio= round(result['sharpe_ratio'],2)                   #夏普比率\n",
    "    return return_drawdown_ratio , sharpe_ratio"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "#设置优化方向：最大化收益回撤比，最大化夏普比率\n",
    "creator.create(\"FitnessMulti\", base.Fitness, weights=(1.0, 1.0)) # 1.0 求最大值；-1.0 求最小值\n",
    "creator.create(\"Individual\", list, fitness=creator.FitnessMulti)\n",
    "\n",
    "def optimize():\n",
    "    \"\"\"\"\"\"   \n",
    "    toolbox = base.Toolbox()  #Toolbox是deap库内置的工具箱，里面包含遗传算法中所用到的各种函数\n",
    "\n",
    "    # 初始化     \n",
    "    toolbox.register(\"individual\", tools.initIterate, creator.Individual,parameter_generate) # 注册个体：随机生成的策略参数parameter_generate()                                          \n",
    "    toolbox.register(\"population\", tools.initRepeat, list, toolbox.individual)               #注册种群：个体形成种群                                    \n",
    "    toolbox.register(\"mate\", tools.cxTwoPoint)                                               #注册交叉：两点交叉  \n",
    "    toolbox.register(\"mutate\", tools.mutUniformInt,low = 4,up = 40,indpb=0.6)                #注册变异：随机生成一定区间内的整数\n",
    "    toolbox.register(\"evaluate\", object_func)                                                #注册评估：优化目标函数object_func()    \n",
    "    toolbox.register(\"select\", tools.selNSGA2)       #注册选择:NSGA-II(带精英策略的非支配排序的遗传算法)\n",
    "    #pool = multiprocessing.Pool()\n",
    "    #toolbox.register(\"map\", pool.map)\n",
    "    #toolbox.register(\"map\", futures.map)\n",
    "\n",
    "    #遗传算法参数设置\n",
    "    MU = 40                                  #设置每一代选择的个体数\n",
    "    LAMBDA = 160                             #设置每一代产生的子女数\n",
    "    pop = toolbox.population(400)            #设置族群里面的个体数量\n",
    "    CXPB, MUTPB, NGEN = 0.5, 0.35,40        #分别为种群内部个体的交叉概率、变异概率、产生种群代数\n",
    "    hof = tools.ParetoFront()                #解的集合：帕累托前沿(非占优最优集)\n",
    "\n",
    "    #解的集合的描述统计信息\n",
    "    #集合内平均值，标准差，最小值，最大值可以体现集合的收敛程度\n",
    "    #收敛程度低可以增加算法的迭代次数\n",
    "    stats = tools.Statistics(lambda ind: ind.fitness.values)\n",
    "    np.set_printoptions(suppress=True)            #对numpy默认输出的科学计数法转换\n",
    "    stats.register(\"mean\", np.mean, axis=0)       #统计目标优化函数结果的平均值\n",
    "    stats.register(\"std\", np.std, axis=0)         #统计目标优化函数结果的标准差\n",
    "    stats.register(\"min\", np.min, axis=0)         #统计目标优化函数结果的最小值\n",
    "    stats.register(\"max\", np.max, axis=0)         #统计目标优化函数结果的最大值\n",
    "\n",
    "    #运行算法\n",
    "    algorithms.eaMuPlusLambda(pop, toolbox, MU, LAMBDA, CXPB, MUTPB, NGEN, stats,\n",
    "                              halloffame=hof)     #esMuPlusLambda是一种基于(μ+λ)选择策略的多目标优化分段遗传算法\n",
    "\n",
    "    return pop"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "optimize()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
